home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2000 March / maximum-cd-2000-03.iso / Quake3 Game Source / Q3AGameSource.exe / Main / ui_playersettings.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-01-18  |  14.3 KB  |  494 lines

  1. // Copyright (C) 1999-2000 Id Software, Inc.
  2. //
  3. #include "ui_local.h"
  4.  
  5. #define ART_FRAMEL            "menu/art/frame2_l"
  6. #define ART_FRAMER            "menu/art/frame1_r"
  7. #define ART_MODEL0            "menu/art/model_0"
  8. #define ART_MODEL1            "menu/art/model_1"
  9. #define ART_BACK0            "menu/art/back_0"
  10. #define ART_BACK1            "menu/art/back_1"
  11. #define ART_FX_BASE            "menu/art/fx_base"
  12. #define ART_FX_BLUE            "menu/art/fx_blue"
  13. #define ART_FX_CYAN            "menu/art/fx_cyan"
  14. #define ART_FX_GREEN        "menu/art/fx_grn"
  15. #define ART_FX_RED            "menu/art/fx_red"
  16. #define ART_FX_TEAL            "menu/art/fx_teal"
  17. #define ART_FX_WHITE        "menu/art/fx_white"
  18. #define ART_FX_YELLOW        "menu/art/fx_yel"
  19.  
  20. #define ID_NAME            10
  21. #define ID_HANDICAP        11
  22. #define ID_EFFECTS        12
  23. #define ID_BACK            13
  24. #define ID_MODEL        14
  25.  
  26. #define MAX_NAMELENGTH    20
  27.  
  28.  
  29. typedef struct {
  30.     menuframework_s        menu;
  31.  
  32.     menutext_s            banner;
  33.     menubitmap_s        framel;
  34.     menubitmap_s        framer;
  35.     menubitmap_s        player;
  36.  
  37.     menufield_s            name;
  38.     menulist_s            handicap;
  39.     menulist_s            effects;
  40.  
  41.     menubitmap_s        back;
  42.     menubitmap_s        model;
  43.     menubitmap_s        item_null;
  44.  
  45.     qhandle_t            fxBasePic;
  46.     qhandle_t            fxPic[7];
  47.     playerInfo_t        playerinfo;
  48.     int                    current_fx;
  49.     char                playerModel[MAX_QPATH];
  50. } playersettings_t;
  51.  
  52. static playersettings_t    s_playersettings;
  53.  
  54. static int gamecodetoui[] = {4,2,3,0,5,1,6};
  55. static int uitogamecode[] = {4,6,2,3,1,5,7};
  56.  
  57. static const char *handicap_items[] = {
  58.     "None",
  59.     "95",
  60.     "90",
  61.     "85",
  62.     "80",
  63.     "75",
  64.     "70",
  65.     "65",
  66.     "60",
  67.     "55",
  68.     "50",
  69.     "45",
  70.     "40",
  71.     "35",
  72.     "30",
  73.     "25",
  74.     "20",
  75.     "15",
  76.     "10",
  77.     "5",
  78.     0
  79. };
  80.  
  81.  
  82. /*
  83. =================
  84. PlayerSettings_DrawName
  85. =================
  86. */
  87. static void PlayerSettings_DrawName( void *self ) {
  88.     menufield_s        *f;
  89.     qboolean        focus;
  90.     int                style;
  91.     char            *txt;
  92.     char            c;
  93.     float            *color;
  94.     int                n;
  95.     int                basex, x, y;
  96.     char            name[32];
  97.  
  98.     f = (menufield_s*)self;
  99.     basex = f->generic.x;
  100.     y = f->generic.y;
  101.     focus = (f->generic.parent->cursor == f->generic.menuPosition);
  102.  
  103.     style = UI_LEFT|UI_SMALLFONT;
  104.     color = text_color_normal;
  105.     if( focus ) {
  106.         style |= UI_PULSE;
  107.         color = text_color_highlight;
  108.     }
  109.  
  110.     UI_DrawProportionalString( basex, y, "Name", style, color );
  111.  
  112.     // draw the actual name
  113.     basex += 64;
  114.     y += PROP_HEIGHT;
  115.     txt = f->field.buffer;
  116.     color = g_color_table[ColorIndex(COLOR_WHITE)];
  117.     x = basex;
  118.     while ( (c = *txt) != 0 ) {
  119.         if ( !focus && Q_IsColorString( txt ) ) {
  120.             n = ColorIndex( *(txt+1) );
  121.             if( n == 0 ) {
  122.                 n = 7;
  123.             }
  124.             color = g_color_table[n];
  125.             txt += 2;
  126.             continue;
  127.         }
  128.         UI_DrawChar( x, y, c, style, color );
  129.         txt++;
  130.         x += SMALLCHAR_WIDTH;
  131.     }
  132.  
  133.     // draw cursor if we have focus
  134.     if( focus ) {
  135.         if ( trap_Key_GetOverstrikeMode() ) {
  136.             c = 11;
  137.         } else {
  138.             c = 10;
  139.         }
  140.  
  141.         style &= ~UI_PULSE;
  142.         style |= UI_BLINK;
  143.  
  144.         UI_DrawChar( basex + f->field.cursor * SMALLCHAR_WIDTH, y, c, style, color_white );
  145.     }
  146.  
  147.     // draw at bottom also using proportional font
  148.     Q_strncpyz( name, f->field.buffer, sizeof(name) );
  149.     Q_CleanStr( name );
  150.     UI_DrawProportionalString( 320, 440, name, UI_CENTER|UI_BIGFONT, text_color_normal );
  151. }
  152.  
  153.  
  154. /*
  155. =================
  156. PlayerSettings_DrawHandicap
  157. =================
  158. */
  159. static void PlayerSettings_DrawHandicap( void *self ) {
  160.     menulist_s        *item;
  161.     qboolean        focus;
  162.     int                style;
  163.     float            *color;
  164.  
  165.     item = (menulist_s *)self;
  166.     focus = (item->generic.parent->cursor == item->generic.menuPosition);
  167.  
  168.     style = UI_LEFT|UI_SMALLFONT;
  169.     color = text_color_normal;
  170.     if( focus ) {
  171.         style |= UI_PULSE;
  172.         color = text_color_highlight;
  173.     }
  174.  
  175.     UI_DrawProportionalString( item->generic.x, item->generic.y, "Handicap", style, color );
  176.     UI_DrawProportionalString( item->generic.x + 64, item->generic.y + PROP_HEIGHT, handicap_items[item->curvalue], style, color );
  177. }
  178.  
  179.  
  180. /*
  181. =================
  182. PlayerSettings_DrawEffects
  183. =================
  184. */
  185. static void PlayerSettings_DrawEffects( void *self ) {
  186.     menulist_s        *item;
  187.     qboolean        focus;
  188.     int                style;
  189.     float            *color;
  190.  
  191.     item = (menulist_s *)self;
  192.     focus = (item->generic.parent->cursor == item->generic.menuPosition);
  193.  
  194.     style = UI_LEFT|UI_SMALLFONT;
  195.     color = text_color_normal;
  196.     if( focus ) {
  197.         style |= UI_PULSE;
  198.         color = text_color_highlight;
  199.     }
  200.  
  201.     UI_DrawProportionalString( item->generic.x, item->generic.y, "Effects", style, color );
  202.  
  203.     UI_DrawHandlePic( item->generic.x + 64, item->generic.y + PROP_HEIGHT + 8, 128, 8, s_playersettings.fxBasePic );
  204.     UI_DrawHandlePic( item->generic.x + 64 + item->curvalue * 16 + 8, item->generic.y + PROP_HEIGHT + 6, 16, 12, s_playersettings.fxPic[item->curvalue] );
  205. }
  206.  
  207.  
  208. /*
  209. =================
  210. PlayerSettings_DrawPlayer
  211. =================
  212. */
  213. static void PlayerSettings_DrawPlayer( void *self ) {
  214.     menubitmap_s    *b;
  215.     vec3_t            viewangles;
  216.     char            buf[MAX_QPATH];
  217.  
  218.     trap_Cvar_VariableStringBuffer( "model", buf, sizeof( buf ) );
  219.     if ( strcmp( buf, s_playersettings.playerModel ) != 0 ) {
  220.         UI_PlayerInfo_SetModel( &s_playersettings.playerinfo, buf );
  221.         strcpy( s_playersettings.playerModel, buf );
  222.  
  223.         viewangles[YAW]   = 180 - 30;
  224.         viewangles[PITCH] = 0;
  225.         viewangles[ROLL]  = 0;
  226.         UI_PlayerInfo_SetInfo( &s_playersettings.playerinfo, LEGS_IDLE, TORSO_STAND, viewangles, vec3_origin, WP_MACHINEGUN, qfalse );
  227.     }
  228.  
  229.     b = (menubitmap_s*) self;
  230.     UI_DrawPlayer( b->generic.x, b->generic.y, b->width, b->height, &s_playersettings.playerinfo, uis.realtime/2 );
  231. }
  232.  
  233.  
  234. /*
  235. =================
  236. PlayerSettings_SaveChanges
  237. =================
  238. */
  239. static void PlayerSettings_SaveChanges( void ) {
  240.     // name
  241.     trap_Cvar_Set( "name", s_playersettings.name.field.buffer );
  242.  
  243.     // handicap
  244.     trap_Cvar_SetValue( "handicap", 100 - s_playersettings.handicap.curvalue * 5 );
  245.  
  246.     // effects color
  247.     trap_Cvar_SetValue( "color", uitogamecode[s_playersettings.effects.curvalue] );
  248. }
  249.  
  250.  
  251. /*
  252. =================
  253. PlayerSettings_MenuKey
  254. =================
  255. */
  256. static sfxHandle_t PlayerSettings_MenuKey( int key ) {
  257.     if( key == K_MOUSE2 || key == K_ESCAPE ) {
  258.         PlayerSettings_SaveChanges();
  259.     }
  260.     return Menu_DefaultKey( &s_playersettings.menu, key );
  261. }
  262.  
  263.  
  264. /*
  265. =================
  266. PlayerSettings_SetMenuItems
  267. =================
  268. */
  269. static void PlayerSettings_SetMenuItems( void ) {
  270.     vec3_t    viewangles;
  271.     int        c;
  272.     int        h;
  273.  
  274.     // name
  275.     Q_strncpyz( s_playersettings.name.field.buffer, UI_Cvar_VariableString("name"), sizeof(s_playersettings.name.field.buffer) );
  276.  
  277.     // effects color
  278.     c = trap_Cvar_VariableValue( "color" ) - 1;
  279.     if( c < 0 || c > 6 ) {
  280.         c = 6;
  281.     }
  282.     s_playersettings.effects.curvalue = gamecodetoui[c];
  283.  
  284.     // model/skin
  285.     memset( &s_playersettings.playerinfo, 0, sizeof(playerInfo_t) );
  286.     
  287.     viewangles[YAW]   = 180 - 30;
  288.     viewangles[PITCH] = 0;
  289.     viewangles[ROLL]  = 0;
  290.  
  291.     UI_PlayerInfo_SetModel( &s_playersettings.playerinfo, UI_Cvar_VariableString( "model" ) );
  292.     UI_PlayerInfo_SetInfo( &s_playersettings.playerinfo, LEGS_IDLE, TORSO_STAND, viewangles, vec3_origin, WP_MACHINEGUN, qfalse );
  293.  
  294.     // handicap
  295.     h = Com_Clamp( 5, 100, trap_Cvar_VariableValue("handicap") );
  296.     s_playersettings.handicap.curvalue = 20 - h / 5;
  297. }
  298.  
  299.  
  300. /*
  301. =================
  302. PlayerSettings_MenuEvent
  303. =================
  304. */
  305. static void PlayerSettings_MenuEvent( void* ptr, int event ) {
  306.     if( event != QM_ACTIVATED ) {
  307.         return;
  308.     }
  309.  
  310.     switch( ((menucommon_s*)ptr)->id ) {
  311.     case ID_HANDICAP:
  312.         trap_Cvar_Set( "handicap", va( "%i", 100 - 25 * s_playersettings.handicap.curvalue ) );
  313.         break;
  314.  
  315.     case ID_MODEL:
  316.         PlayerSettings_SaveChanges();
  317.         UI_PlayerModelMenu();
  318.         break;
  319.  
  320.     case ID_BACK:
  321.         PlayerSettings_SaveChanges();
  322.         UI_PopMenu();
  323.         break;
  324.     }
  325. }
  326.  
  327.  
  328. /*
  329. =================
  330. PlayerSettings_MenuInit
  331. =================
  332. */
  333. static void PlayerSettings_MenuInit( void ) {
  334.     int        y;
  335.  
  336.     memset(&s_playersettings,0,sizeof(playersettings_t));
  337.  
  338.     PlayerSettings_Cache();
  339.  
  340.     s_playersettings.menu.key        = PlayerSettings_MenuKey;
  341.     s_playersettings.menu.wrapAround = qtrue;
  342.     s_playersettings.menu.fullscreen = qtrue;
  343.  
  344.     s_playersettings.banner.generic.type  = MTYPE_BTEXT;
  345.     s_playersettings.banner.generic.x     = 320;
  346.     s_playersettings.banner.generic.y     = 16;
  347.     s_playersettings.banner.string        = "PLAYER SETTINGS";
  348.     s_playersettings.banner.color         = color_white;
  349.     s_playersettings.banner.style         = UI_CENTER;
  350.  
  351.     s_playersettings.framel.generic.type  = MTYPE_BITMAP;
  352.     s_playersettings.framel.generic.name  = ART_FRAMEL;
  353.     s_playersettings.framel.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
  354.     s_playersettings.framel.generic.x     = 0;
  355.     s_playersettings.framel.generic.y     = 78;
  356.     s_playersettings.framel.width         = 256;
  357.     s_playersettings.framel.height        = 329;
  358.  
  359.     s_playersettings.framer.generic.type  = MTYPE_BITMAP;
  360.     s_playersettings.framer.generic.name  = ART_FRAMER;
  361.     s_playersettings.framer.generic.flags = QMF_LEFT_JUSTIFY|QMF_INACTIVE;
  362.     s_playersettings.framer.generic.x     = 376;
  363.     s_playersettings.framer.generic.y     = 76;
  364.     s_playersettings.framer.width         = 256;
  365.     s_playersettings.framer.height        = 334;
  366.  
  367.     y = 144;
  368.     s_playersettings.name.generic.type            = MTYPE_FIELD;
  369.     s_playersettings.name.generic.flags            = QMF_NODEFAULTINIT;
  370.     s_playersettings.name.generic.ownerdraw        = PlayerSettings_DrawName;
  371.     s_playersettings.name.field.widthInChars    = MAX_NAMELENGTH;
  372.     s_playersettings.name.field.maxchars        = MAX_NAMELENGTH;
  373.     s_playersettings.name.generic.x                = 192;
  374.     s_playersettings.name.generic.y                = y;
  375.     s_playersettings.name.generic.left            = 192 - 8;
  376.     s_playersettings.name.generic.top            = y - 8;
  377.     s_playersettings.name.generic.right            = 192 + 200;
  378.     s_playersettings.name.generic.bottom        = y + 2 * PROP_HEIGHT;
  379.  
  380.     y += 3 * PROP_HEIGHT;
  381.     s_playersettings.handicap.generic.type        = MTYPE_SPINCONTROL;
  382.     s_playersettings.handicap.generic.flags        = QMF_NODEFAULTINIT;
  383.     s_playersettings.handicap.generic.id        = ID_HANDICAP;
  384.     s_playersettings.handicap.generic.ownerdraw    = PlayerSettings_DrawHandicap;
  385.     s_playersettings.handicap.generic.x            = 192;
  386.     s_playersettings.handicap.generic.y            = y;
  387.     s_playersettings.handicap.generic.left        = 192 - 8;
  388.     s_playersettings.handicap.generic.top        = y - 8;
  389.     s_playersettings.handicap.generic.right        = 192 + 200;
  390.     s_playersettings.handicap.generic.bottom    = y + 2 * PROP_HEIGHT;
  391.     s_playersettings.handicap.numitems            = 20;
  392.  
  393.     y += 3 * PROP_HEIGHT;
  394.     s_playersettings.effects.generic.type        = MTYPE_SPINCONTROL;
  395.     s_playersettings.effects.generic.flags        = QMF_NODEFAULTINIT;
  396.     s_playersettings.effects.generic.id            = ID_EFFECTS;
  397.     s_playersettings.effects.generic.ownerdraw    = PlayerSettings_DrawEffects;
  398.     s_playersettings.effects.generic.x            = 192;
  399.     s_playersettings.effects.generic.y            = y;
  400.     s_playersettings.effects.generic.left        = 192 - 8;
  401.     s_playersettings.effects.generic.top        = y - 8;
  402.     s_playersettings.effects.generic.right        = 192 + 200;
  403.     s_playersettings.effects.generic.bottom        = y + 2* PROP_HEIGHT;
  404.     s_playersettings.effects.numitems            = 7;
  405.  
  406.     s_playersettings.model.generic.type            = MTYPE_BITMAP;
  407.     s_playersettings.model.generic.name            = ART_MODEL0;
  408.     s_playersettings.model.generic.flags        = QMF_RIGHT_JUSTIFY|QMF_PULSEIFFOCUS;
  409.     s_playersettings.model.generic.id            = ID_MODEL;
  410.     s_playersettings.model.generic.callback        = PlayerSettings_MenuEvent;
  411.     s_playersettings.model.generic.x            = 640;
  412.     s_playersettings.model.generic.y            = 480-64;
  413.     s_playersettings.model.width                = 128;
  414.     s_playersettings.model.height                = 64;
  415.     s_playersettings.model.focuspic                = ART_MODEL1;
  416.  
  417.     s_playersettings.player.generic.type        = MTYPE_BITMAP;
  418.     s_playersettings.player.generic.flags        = QMF_INACTIVE;
  419.     s_playersettings.player.generic.ownerdraw    = PlayerSettings_DrawPlayer;
  420.     s_playersettings.player.generic.x            = 400;
  421.     s_playersettings.player.generic.y            = -40;
  422.     s_playersettings.player.width                = 32*10;
  423.     s_playersettings.player.height                = 56*10;
  424.  
  425.     s_playersettings.back.generic.type            = MTYPE_BITMAP;
  426.     s_playersettings.back.generic.name            = ART_BACK0;
  427.     s_playersettings.back.generic.flags            = QMF_LEFT_JUSTIFY|QMF_PULSEIFFOCUS;
  428.     s_playersettings.back.generic.id            = ID_BACK;
  429.     s_playersettings.back.generic.callback        = PlayerSettings_MenuEvent;
  430.     s_playersettings.back.generic.x                = 0;
  431.     s_playersettings.back.generic.y                = 480-64;
  432.     s_playersettings.back.width                    = 128;
  433.     s_playersettings.back.height                = 64;
  434.     s_playersettings.back.focuspic                = ART_BACK1;
  435.  
  436.     s_playersettings.item_null.generic.type        = MTYPE_BITMAP;
  437.     s_playersettings.item_null.generic.flags    = QMF_LEFT_JUSTIFY|QMF_MOUSEONLY|QMF_SILENT;
  438.     s_playersettings.item_null.generic.x        = 0;
  439.     s_playersettings.item_null.generic.y        = 0;
  440.     s_playersettings.item_null.width            = 640;
  441.     s_playersettings.item_null.height            = 480;
  442.  
  443.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.banner );
  444.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.framel );
  445.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.framer );
  446.  
  447.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.name );
  448.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.handicap );
  449.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.effects );
  450.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.model );
  451.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.back );
  452.  
  453.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.player );
  454.  
  455.     Menu_AddItem( &s_playersettings.menu, &s_playersettings.item_null );
  456.  
  457.     PlayerSettings_SetMenuItems();
  458. }
  459.  
  460.  
  461. /*
  462. =================
  463. PlayerSettings_Cache
  464. =================
  465. */
  466. void PlayerSettings_Cache( void ) {
  467.     trap_R_RegisterShaderNoMip( ART_FRAMEL );
  468.     trap_R_RegisterShaderNoMip( ART_FRAMER );
  469.     trap_R_RegisterShaderNoMip( ART_MODEL0 );
  470.     trap_R_RegisterShaderNoMip( ART_MODEL1 );
  471.     trap_R_RegisterShaderNoMip( ART_BACK0 );
  472.     trap_R_RegisterShaderNoMip( ART_BACK1 );
  473.  
  474.     s_playersettings.fxBasePic = trap_R_RegisterShaderNoMip( ART_FX_BASE );
  475.     s_playersettings.fxPic[0] = trap_R_RegisterShaderNoMip( ART_FX_RED );
  476.     s_playersettings.fxPic[1] = trap_R_RegisterShaderNoMip( ART_FX_YELLOW );
  477.     s_playersettings.fxPic[2] = trap_R_RegisterShaderNoMip( ART_FX_GREEN );
  478.     s_playersettings.fxPic[3] = trap_R_RegisterShaderNoMip( ART_FX_TEAL );
  479.     s_playersettings.fxPic[4] = trap_R_RegisterShaderNoMip( ART_FX_BLUE );
  480.     s_playersettings.fxPic[5] = trap_R_RegisterShaderNoMip( ART_FX_CYAN );
  481.     s_playersettings.fxPic[6] = trap_R_RegisterShaderNoMip( ART_FX_WHITE );
  482. }
  483.  
  484.  
  485. /*
  486. =================
  487. UI_PlayerSettingsMenu
  488. =================
  489. */
  490. void UI_PlayerSettingsMenu( void ) {
  491.     PlayerSettings_MenuInit();
  492.     UI_PushMenu( &s_playersettings.menu );
  493. }
  494.